package bizzard.server;
import bizzard.shared.*;
import bizzard.client.BizzardService;

import java.util.*;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import com.thoughtworks.xstream.*;


//+----------------------------------------------------------------------+
//| BizzardServiceImpl
//|
//| - implementation des webservices
//+----------------------------------------------------------------------+

public class BizzardServiceImpl extends RemoteServiceServlet implements BizzardService {

	private static final long serialVersionUID = 1L;

	/*******************************************************************************
	 * appel asynchrone pour recuperer tous les trolls xml
	 * 
	 * @param dir ~ le repertoire où se trouvent les fichiers des trolls
	 * @param races ~ le hashmap de races existantes
	 * @return hashmap indexé sur le nom de la race associé aux trolls de cette race
	 ******************************************************************************/
	@SuppressWarnings("rawtypes")
	public HashMap<String, HashMap> getTrolls(HashMap<String, Race> races, String dir_troll) {
		ArrayList<String> list = new ArrayList<String>();
		list = FileFactory.getFilesNames(dir_troll);
		if(list.isEmpty() || list==null) return null;

		HashMap<String, Troll> trolls = new HashMap<String, Troll>();
		for(String item : list) {
			 if(item.length()>4 && item.substring(item.length()-4,item.length()).contentEquals(".xml")) { //si c'est pas un xml on l'ignore
		     try {	
		    	 	//initialise le parser
			        	XStream xs = new XStream();
			        	xs.alias("Troll", Troll.class);
			        	xs.alias("Race", Race.class);
			        	xs.alias("Attribut", Attribut.class);
		        	
			        //recupere le troll
				        Troll troll = new Troll();
			            FileInputStream fis = new FileInputStream(dir_troll+"/"+item);
			            xs.fromXML(fis, troll);
			            trolls.put(troll.getName(), troll);
					
					//met le troll dans la race
			            Race race = null;
			            String s = troll.getRace().getName();
			            if(races.get(s)==null || races.isEmpty()) {
			            	race = new Race(s);
			            	races.put(s, race);
			            }
			            else race = races.get(s);
			            
			            troll.setRace(race);
			            
		        } catch (Exception ex) {
		            ex.printStackTrace();
		        }
			}
		}
		
		HashMap<String, HashMap> result = new HashMap<String, HashMap>();
		result.put("races", races);
		result.put("trolls", trolls);
		
		return result;
	}
	
	/*******************************************************************************
	 * appel asynchrone pour sauvegarder un troll xml
	 * 
	 * @param dir ~ le repertoire où sauvegarder le troll
	 * @return le troll
	 ******************************************************************************/
	public Troll saveTroll(String dir, Troll troll) {
		try {	
			//initialise le parser
				XStream xs = new XStream();
	        	xs.processAnnotations(Race.class);
	        	xs.processAnnotations(Troll.class);
        	
	        //enregistre le troll
				FileOutputStream outStream = new FileOutputStream(new File(dir + "/" + troll.getName() + ".xml")); 
				xs.toXML(troll,outStream); 
				outStream.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return troll;
	}
	
	/*******************************************************************************
	 * Appel asynchrone pour renommer l'image du troll
	 * 
	 * le troll "name" n'existe pas deja
	 * @param path ~ Le path du fichier à renommer
	 * @param name ~ Le nouveau nom du fichier
	 ******************************************************************************/
	public String renameImg(String path, String name) {		
		File file = new File(path); 
		String extension = file.getName().substring(file.getName().lastIndexOf("."));
		
		String newPath = file.getParent() + "/" + name + extension;		
		file.renameTo(new File(newPath));
		
		return newPath;
	}

	/*******************************************************************************
	 * appel asynchrone pour supprimer un fichier
	 * 
	 * @param name ~ le nom du fichier à supprimer (+ path )
	 * @return vrai si les fichier ont bien été supprimé
	 ******************************************************************************/
	public Boolean deleteFile(String name) {		
		File file = new File(name);
		Boolean flag = file.delete();
		
		return flag;
	}
}
